#ifndef __APP_DEVICE_H
#define __APP_DEVICE_H
#include "app/buffer.h"
#include "app_message.h"


struct vTable;

//定义一个串口设备 约定当创建结构体时需要 初始化0 
typedef struct 
{
    struct vTable * vptr;   //虚表 是一些外部可以改变的方法
    char * filename;        //设备名字
    int fd;                 //设备文件描述符
    Buffer revc_buffer;     //接收缓存区
    Buffer write_buffer;    //发送缓存区
    ConnectType connect_type; //和下游那种设备连接
    int is_running;         //设备是否在运行的标志为
    pthread_t pthread;      //设备的后台线程
}Device;

//虚表  就是为了多态性  不把函数写死  不同的人用可以传不同的函数指针
struct vTable
{
    void *(*background_func)(void *);                //子进程的具体函数
    int (*recv_callback)(Device *,void *,int);       //读串口设备的一个函数 由上游提供
    void (*recv_task)(void *);                       //由线程池执行这个从串口设备里面读数据的任务
    void (*send_task)(void *);                       //由线程池执行这个把串口设备里面的数据发送给下游
    int (*post_read)(Device *,void *,int);      //游兼容层提供比如蓝牙。。。在数据进入缓存区前把数据改称我们需要的格式
    int (*post_write)(Device *,void *,int);      //游兼容层提供比如蓝牙。。。在数据离开缓存区后把数据改称下游需要的格式
};

/// @brief 设备的初始化函数
/// @param device 设备
/// @param fliename 设备名
/// @return succeed 0  fail -1
int app_device_init(Device *device,char * fliename);

/// @brief 启动设备
/// @param device 设备
/// @return succeed 0  fail -1
int app_device_start(Device *device);


/**
 * @brief 特在设备的函数
 * @param
 * @param
 */
int app_device_stop(Device *device);


/// @brief 注册一个用来把自己这个串口设备的数据读走的函数 由上游设备提供 
/// @param device 
/// @param callback 
/// @return 
void app_device_registerReceiveCallback(Device *device,int (*callback)(Device*,void*,int));


/// @brief 用来把接收到的数据写入串口设备 并且注册一个任务 让线程从来区数据
/// @param device 
/// @param ptr 
/// @param len 
/// @return 
int app_device_write(Device *device, void *ptr, int len);



/// @brief 删除一个设备
/// @param device 
void app_device_close(Device *device);

#endif

